package Sort

import (
	"reflect"
	"sort"
)

type OrderBy func(v1, v2 interface{}) bool

type wrapper struct {
	list interface{}
	by   OrderBy
}

func (pw wrapper) Len() int { // 重写 Len() 方法
	if reflect.TypeOf(pw.list).Kind() != reflect.Slice {
		return 0
	}

	list := reflect.ValueOf(pw.list)
	return list.Len()
}
func (pw wrapper) Swap(i, j int) { // 重写 Swap() 方法
	list := reflect.ValueOf(pw.list)

	tmp := list.Index(i).Interface()
	list.Index(i).Set(list.Index(j))
	list.Index(j).Set(reflect.ValueOf(tmp))
}

func (pw wrapper) Less(i, j int) bool { // 重写 Less() 方法
	list := reflect.ValueOf(pw.list)
	return pw.by(list.Index(i).Interface(), list.Index(j).Interface())
}

func Sort(list interface{}, by OrderBy) {
	sort.Sort(wrapper{list, by})
}
